// 给你一个字符串 s ，请你去除字符串中重复的字母，使得每个字母只出现一次。
// 需保证 返回结果的字典序最小（要求不能打乱其他字符的相对位置）。

// 示例 1：
// 输入：s = "bcabc"
// 输出："abc"

// 示例 2：
// 输入：s = "cbacdcbc"
// 输出："acdb"

// 提示：
//     1 <= s.length <= 104
//     s 由小写英文字母组成
/**
 * @param {string} s
 * @return {string}
 */
////bcac
/////思路：首先实现下去重和不改变顺序输出
//////////重点：当stack中没有这个元素时, 准备放入stack数组
////////////////前提是：为了字典序最小，需要把stack数组里的值比当前值大的且数量 > 0 的元素删除
var removeDuplicateLetters = function(s) {
    
    let countMap = new Map();
    for(let v of s) {
        if (countMap.has(v)) {
            countMap.set(v, countMap.get(v) + 1);
        } else {
            countMap.set(v, 1);
        }
    }
    let stack = [];
    for(let v of s) {
        countMap.set(v, countMap.get(v) - 1);
        if (stack.includes(v) === false) {
            let stackLen = stack.length;
            while(stackLen-- && stack[stackLen] > v && countMap.get(stack[stackLen])) {
                stack.pop();
            }
            stack.push(v);
        }
    }
    return stack.join('');
};
console.log(removeDuplicateLetters("bcabc"));

